#ifndef OCK_MEMORY_BRIDGE_OCK_HMM_FACTORY_H
#define OCK_MEMORY_BRIDGE_OCK_HMM_FACTORY_H

#include "ock/hmm/mgr/OckHmmHeteroMemoryMgr.h"

namespace ock {
namespace hmm {
namespace {
const uint32_t MAX_CREATOR_TIMEOUT_MILLISECONDS = 5000U
}
class OckHmmFactory
{
public:
    virtual ~OckHmmFactory() noexcept = default;
    virtual std::pair<OckHmmErrorCode, std::shared_ptr<OckHmmSingleDeviceMgr>> CreateSingleDeviceMemoryMgr(
        std::shared_ptr<OckHmmDeviceInfo> deviceInfo, uint32_t timeout = MAX_CREATOR_TIMEOUT_MILLISECONDS) = 0;

    virtual std::pair<OckHmmErrorCode, std::shared_ptr<OckHmmComposeDeviceMgr>> CreateComposeMemoryMgr(
        std::shared_ptr<OckHmmDeviceInfoVec> deviceInfoVec, uint32_t timeout = MAX_CREATOR_TIMEOUT_MILLISECONDS) = 0;

    virtual std::pair<OckHmmErrorCode, std::shared_ptr<OckHmmShareDeviceMgr>> CreateShareMemoryMgr(
        std::shared_ptr<OckHmmPureDeviceInfoVec> deviceInfoVec,
        std::shared_ptr<OckHmmMemoryCapacitySpecification> hostSpec) = 0;

    static std::shared_ptr<OckHmmFactory> Create(void);
};
}
}
#endif
